/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package entidades.miembros;

import com.fasterxml.jackson.annotation.JsonIgnore;
import entidades.Cuota;
import entidades.DatosInstitucionales;
import entidades.DatosPersonales;
import entidades.Domicilio;
import entidades.Tutor;
import java.beans.PropertyChangeSupport;
import java.io.Serializable;
import java.sql.Timestamp;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.persistence.Version;

/**
 *
 * @author fcarou
 */
@Entity
@Table (name = "SOCIOS")
@NamedQueries 
({
    @NamedQuery (name = "buscarSocios", query = "select s from Socio s"),
    @NamedQuery (name = "buscarPorNombreApellido", query = "select s from Socio s where s.datosInstitucionales.baja is NULL and (s.datosPersonales.identificacion.nombre LIKE CONCAT('%', ?1, '%') or s.datosPersonales.identificacion.apellido LIKE CONCAT('%', ?1, '%'))")
})
public class Socio extends Miembro implements Serializable
{
    @Transient
    @JsonIgnore
    private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
    
    @OneToOne (cascade = CascadeType.ALL)
    @JoinColumn (name = "DATOS_PERSONALES")
    private DatosPersonales datosPersonales;
    
    @OneToOne (cascade = CascadeType.ALL)
    @JoinColumn (name = "DATOS_INSTITUCIONALES")
    private DatosInstitucionales datosInstitucionales;
    
    @ManyToOne (cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
    @JoinColumn (name = "DOMICILIO")
    private Domicilio domicilio;
    
    @OneToMany (cascade = CascadeType.ALL)
    @JoinColumn (name = "CUOTAS")
    private List<Cuota> cuotas;
    
    @Version
    private Timestamp version;
    
    public Socio ()
    {
        super ();
    }

    public PropertyChangeSupport getChangeSupport()
    {
        return changeSupport;
    }

    public void setChangeSupport(PropertyChangeSupport changeSupport)
    {
        this.changeSupport = changeSupport;
    }

    public DatosPersonales getDatosPersonales()
    {
        return datosPersonales;
    }

    public void setDatosPersonales(DatosPersonales datosPersonales)
    {
        this.datosPersonales = datosPersonales;
    }

    public DatosInstitucionales getDatosInstitucionales()
    {
        return datosInstitucionales;
    }

    public void setDatosInstitucionales(DatosInstitucionales datosInstitucionales)
    {
        this.datosInstitucionales = datosInstitucionales;
    }

    public Domicilio getDomicilio()
    {
        return domicilio;
    }

    public void setDomicilio(Domicilio domicilio)
    {
        this.domicilio = domicilio;
    }

    public List<Cuota> getCuotas()
    {
        return cuotas;
    }

    public void setCuotas(List<Cuota> cuotas)
    {
        this.cuotas = cuotas;
    }
    
    public void imprimirListeners ()
    {
        System.out.println("Socio, listeners: " + changeSupport.getPropertyChangeListeners().length);
    }
}
